package com.empsys.old.aspects;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

/**
 * @author wzm
 * @create 2023-12-16 11:34
 * project_name:web2310
 * @Description
 */
//理解不同通知类型
//@Aspect
//@Component
@Slf4j
//@Order(2)  //控制切面类执行的顺序  前置通知数字越小先执行  后置通知反之
public class AspectTest1 {

    //前置通知
    @Before("execution(* com.empsys.service.impl.*.*(..))")
    public void before(JoinPoint joinPoint){
        log.info("前置通知1...");
    }


    //引用别的类中的切入点表达式 但是需要public修饰
   /* @Before("com.empsys.aspects.AspectTest2.pt()")
    public void before(JoinPoint joinPoint){
        log.info("前置通知...");
    }
*/

    //环绕通知 ProceedingJoinPoint只有环绕通知需要用这个调用
    @Around("execution(* com.empsys.service.impl.*.*(..))")
    public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        log.info("环绕前1...");
        Object proceed = proceedingJoinPoint.proceed();//调用方法
        log.info("环绕后1...");
        return proceed;
    }


    //后置通知  无论有没有异常
    @After("execution(* com.empsys.service.impl.*.*(..))")
    public void after(JoinPoint joinPoint){
        log.info("后置通知1...");

    }


    //返回后通知 程序正常执行后后执行 有异常不会执行
    @AfterReturning("execution(* com.empsys.service.impl.*.*(..))")
    public void afterReturn(JoinPoint joinPoint){
        log.info("返回后通知1...");

    }

    //异常通知
    @AfterThrowing("execution(* com.empsys.service.impl.*.*(..))")
    public void afterThrowing(JoinPoint joinPoint){
        log.info("异常通知1...");
    }




}
